iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 10

Day 10 Types with Abilities

  • 分享至 

  • xImage
  •  

上一篇我們提到,可以給予四種不同類型。今天我們來深入了解一下。

Move 的類型都可以擁有四種能力: 複製、放置、儲存、密鑰

複製 Copy

• 允許複製具有此能力的類型的值。

放置 Drop

◦ 允許彈出/刪除具有此能力的類型的值。

儲存 Store

◦ 允許具有這種能力的類型的值存在於全局存儲的結構中。

密鑰 Key

◦ 允許該類型作為全局存儲操作的鍵。

|原始類型和內置類型的能力是預定也不能更改的: Integers、vector、address和 boolean 具有複製刪除和儲存能力

然而,前一篇介紹的 Struct (自定義類型) 則可以指定能力。

schema

struct NAME has ABILITY [, ABILITY] { [FIELDS] }

example

module Library {
    
    // each ability has matching keyword
    // multiple abilities are listed with comma
    struct Book has store, copy, drop {
        year: u64
    }

    // single ability is also possible
    struct Storage has key {
        books: vector<Book>
    }

    // this one has no abilities 
    struct Empty {}
}

沒有能力的結構

如果使用沒有能力的結構會發生什麼事呢?

address 0x3 {
	module M {
	    struct People { id: u8 }

			public fun new_people(id: u8,): People {
	      People { id }
    }
	}
}

script {
    use 0x1::Debug;
    use 0x3::M;

    fun main() {
        People::new_people(1);
    }    
}

運行上面程式將會出現錯誤,因為 People 類型沒有 drop 能力,所以當函數結束時自動刪除將會失敗,導致 error 發生,要解決此錯誤就是在 People struct 加上 drop 能力。

error: 
   ┌── scripts/main.move:7:11 ───
   │
 5 │     People::new_people(1)
   │     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cannot ignore values without the 'drop' ability. The value must be used
   │

Drop

上面的 error 例子,我們加上 drop 能力在 struct 上就可以解決

address 0x3 {
	module M {
	    struct People has drop { id: u8 }

			public fun new_people(id: u8,): People {
	      People { id }
    }
	}
}

Copy

如果要創建一個副本,就必須使用關鍵字 copy 來實現(後面會詳細介紹),而 struct 如果沒有特別給予複製能力,執行時會發生錯誤。

script {
    use 0x1::Debug;
    use 0x3::M;

    fun main() {
				let myPeople = People::new_people(1);
				let _ = copy myPeople;
    }    
}
┌── scripts/main.move:7:20 ───
   │
				let _ = copy myPeople
   │                 ^^^^^^^^^^^^ Invalid 'copy' of owned value without the 'copy' ability
   │

Store

允許具有這種能力的類型的值存在於全局存儲中的結構(資源)內部,不一定作為全局存儲中的頂級資源。這是唯一不直接控制操作的能力。

Key

key 能力對所有全局存儲操作進行了門控,因此為了使類型與move_toborrow_globalmove_from等一起使用,該類型必須具有該key能力。請注意,操作仍然必須在key定義類型的模塊中使用。

總結:

  • 原始類型有存儲、複製和刪除。
  • 默認情況下,結構沒有能力。
  • 一個結構最多可以設置 4 個能力。

Store 和 Key 能力我們在後面篇章會看到更多程式範例,讓我們 Move to Day11


上一篇
Day 9 Struct
下一篇
Day 11 Advanced Topics: Global Storage Structures / Operators
系列文
Smart-Contract Language: Move30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言